from datetime import datetime, date, time, timedelta
from dateutil import parser
import numpy as np

# datetime 是 Python 中处理日期的标准模块，
# 它提供了 4 种对日期和时间进行处理的类：datetime、date、time 和timedelta
# 。
# class datetime(date):
#     def __init__(self, year, month, day, hour, minute, second, microsecond, tzinfo)
#
#         pass
#
#     def now(cls, tz=None):
#         pass
#
#     def timestamp(self):
#         pass
#
#     def fromtimestamp(cls, t, tz=None):
#         pass
#
#     def date(self):
#         pass
#
#     def time(self):
#         pass
#
#     def year(self):
#         pass
#
#     def month(self):
#         pass
#
#     def day(self):
#         pass
#
#     def hour(self):
#         pass
#
#     def minute(self):
#         pass
#
#     def second(self):
#         pass
#
#     def isoweekday(self):
#         pass
#
#     def strftime(self, fmt):
#
#         pass
#
#     def combine(cls, date, time, tzinfo=True):
#         pass


print(datetime(2021, 12, 2, 18, 00, 21))  # 2021-12-02 18:00:21

print(datetime(year=2021, month=12, day=1))  # 2021-12-01 00:00:00

dt_1 = datetime(2021, 12, 2, 18, 00, 21)
print('dt_1', dt_1)
print('dt_1', dt_1.timestamp())  # 时间戳
print(datetime.now())

"""
1.  格式化 datetime 对象。datetime.strftime(fmt) 
%a 本地简化星期名称（如星期一，返回 Mon）
%A 本地完整星期名称（如星期一，返回 Monday）
%b 本地简化的月份名称（如一月，返回 Jan）
%B 本地完整的月份名称（如一月，返回 January）
%c 本地相应的日期表示和时间表示
%d 月内中的一天（0-31）
%H 24小时制小时数（0-23）
%I 12小时制小时数（01-12）
%j 年内的一天（001-366）
%m 月份（01-12）
%M 分钟数（00-59）
%p 本地A.M.或P.M.的等价符
%S 秒（00-59）
%U 一年中的星期数（00-53）星期天为星期的开始
%w 星期（0-6），星期天为星期的开始
%W 一年中的星期数（00-53）星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%y 两位数的年份表示（00-99）
%Y 四位数的年份表示（0000-9999）
%Z 当前时区的名称（如果是本地时间，返回空字符串）
%% %号本身

"""
print("=============datetime===============")
dt_2 = datetime(2021, 12, 12, 10, 12, 59)
dt_2_format = dt_2.strftime("%Y-%m-%d %H:%M:%S")  # 2021-12-12 10:12:59
print('dt_2', dt_2)
print('dt_2.date()', dt_2.date())
print('dt_2.time()', dt_2.time())
print('dt_2.year', dt_2.year)
print('dt_2.month', dt_2.month)
print('dt_2.day', dt_2.day)
print('dt_2.minute', dt_2.minute)
print('dt_2.second', dt_2.second)
print('dt_2.isoweekday', dt_2.isoweekday())

print(dt_2_format)

d_1 = date(2021, 12, 12)

print(d_1)

"""
在处理含有字符串日期的数据集或表格时，我们需要一种自动解析字符串的方法，无论它是什么格式的，都可以将其转化
为 datetime 对象。这时，就要使用到 dateutil 中的 parser 模块。
"""
print("=============parser===============")

print(parser.parse('2021-12-22'))
print(parser.parse('2021-12-22 12:22:59'))

"""
# class date:
#     def __init__(self, year, month, day):
#         pass
#     def today(cls):
#         pass
"""
print("=============date===============")
dateString = ['Oct, 2, 1869', 'Oct, 10, 1869', 'Oct, 15, 1869', 'Oct, 20, 1869', 'Oct, 23, 1869']
dates = [parser.parse(i) for i in dateString]
# print(dates)
td = np.diff(dates)
print(td)
# [datetime.timedelta(days=8) datetime.timedelta(days=5)
# datetime.timedelta(days=5) datetime.timedelta(days=3)]
d = [i.days for i in td]
print(d)  # [8, 5, 5, 3]

# 获取当前日期信息。
print(date.today())

"""
class time:
 def __init__(self, hour, minute, second, microsecond, tzinfo):
 pass
"""

print("=============time===============")
print(time(12, 23, 58))
print(type(time(12, 23, 58)))

dt_3 = datetime(2021, 12, 2, 18, 00, 21)  # 2021-12-02 18:00:21

print(datetime.combine(dt_3, time.min))
print(datetime.combine(dt_3, time.max))

"""
timedelta 表示具体时间实例中的一段时间。你可以把它们简单想象成两个日期或时间之间的间隔。
它常常被用来从 datetime 对象中添加或移除一段特定的时间。

如果将两个 datetime 对象相减，就会得到表示该时间间隔的 timedelta 对象。
同样地，将两个时间间隔相减，可以得到另一个 timedelta 对象。
"""
print("=============timedelta===============")
print(timedelta(days=30))

dt_min = datetime(2020, 12, 20, 2, 11, 58)
dt_max = datetime(2020, 12, 28, 12, 11, 58)
print('timedelta', dt_max - dt_min)  # 8 days, 10:00:00
print('timedelta', dt_min - dt_max)  # -9 days, 14:00:00
